﻿//using System;
//using System.Collections.Generic;
//using System.Globalization;
//using System.Linq;
//using System.Net;
//using System.Text;
//using System.Windows.Forms;
//using HtmlAgilityPack;
//using Studentium.Util;
//using HtmlDocument = HtmlAgilityPack.HtmlDocument;
//
//namespace Studentium.Entities
//{
//    class Schedule
//    {
//        private const string baseUrl = "http://public.calendarpad.com/calendar110313-563/";
//        private readonly Dictionary<DateTime,List<ScheduleEntry>> dayToClasses = new Dictionary<DateTime, List<ScheduleEntry>>();
//
//        private static Schedule singleton;
//
//        public static Schedule Singleton
//        {
//            get 
//            {
//                if (singleton == null)
//                    singleton = new Schedule();
//                return singleton; 
//            }            
//        }
//
//        internal static void Initialize()
//        {
//            if (singleton == null)
//                singleton = new Schedule();
//        }
//
//        private Schedule()
//        {            
//            Load(DateTime.Now);
//            Load(DateTime.Now.AddMonths(1));
//        }
//
//        private void Load(DateTime baseDate)
//        {
//            string url = baseUrl + baseDate.ToString("MMMMyyyy", new CultureInfo("en-US")) + ".html";
//
//            HtmlDocument doc;
//            try
//            {
//                doc = new HtmlWeb().Load(url);
//            }
//            catch(Exception e)
//            {
//                Log.log("Error while downloading schedule", e);
//                MessageBox.Show("Network connection error", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
//                return;
//            }
//
//
//            HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//table[@class='calendar']//td");
//            foreach (HtmlNode dayNode in nodes)
//            {
//                try
//                {
                    // find out day number
//                    HtmlNodeCollection dateNodes = dayNode.SelectNodes(".//div[@class='Date']");
//                    if (dateNodes == null || dateNodes.Count == 0)
//                        continue;
//
//                    string dateTxt = dateNodes.First().InnerText;
//                    int day;
//                    if (!Int32.TryParse(dateTxt, out day))
//                    {
//                        throw new Exception("Schedule scheme was changed. Cann't parse day number");
//                    }
//                    DateTime currentDay = new DateTime(baseDate.Year, baseDate.Month, day);
//                    dayToClasses[currentDay] = new List<ScheduleEntry>();
//
                    // get classes
//                    HtmlNodeCollection classes = dayNode.SelectNodes(".//a[position()>1]");
//                    if (classes == null || classes.Count == 0)
//                        continue;
//                    foreach (HtmlNode _class in classes)
//                    {
//                        string className = _class.FirstChild.InnerText;
//                        DateTime time = DateTime.Now;
//                        HtmlNode dateNode = _class.SelectSingleNode("span[@class='dt']");
//
//                        string startDate = dateNode.InnerText.Split('-')[0];
//                        if (!DateTime.TryParse(startDate, out time))
//                        {
//                            throw new Exception("Schedule scheme was changed. Cann't parse time - " + time);
//                        }
//
//                        DateTime classDate = currentDay + time.TimeOfDay;
//                        dayToClasses[currentDay].Add(new ScheduleEntry(className, classDate));
//                    }
//                }
//                catch
//                {
//                    throw new Exception("Schedule scheme was changed.");
//                }
//            }
//        }
//
//        internal object GetClasses(DateTime dateTime)
//        {
//            return dayToClasses[new DateTime(dateTime.Year, dateTime.Month, dateTime.Day)];
//        }
//    }
//}
